home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / lists / mint / l_0399 / 177 < prev    next >
Internet Message Format  |  1994-08-27  |  8KB

  1. Date: 23 Mar 1993 17:41:02 -0500 (EST)
  2. From: ianl@bix.com
  3. Subject: RE: wanted: ARGV standard extension
  4. In-Reply-To: <9303231044.AA02211@irz405.inf.tu-dresden.de>
  5. To: hohmuth@freia.sax.de
  6. Message-Id: <9303231741.memo.68475@BIX.com> Tue,
  7.  23 Mar 1993 17:41:02 -0500 (EST)
  8. X-Cosy-To: hohmuth@freia.inf.tu-dresden.de
  9.  
  10.  
  11.  I vaguely remember the prior discussions on passing empty args. 
  12. That was right before I did my temporary drop-out from the usenet
  13. scene.  I also remember the method you outlined as being one of the
  14. most robust. My only real objection to it was the complexity of the
  15. code to implement it.  Call me lazy if you will, but after 22 years
  16. of programming, I put a lot of stock in the idea of long design
  17. leading to the simplest possible code.  
  18.  
  19.  Not that the method is a nightmare of coding by any means, but it
  20. does mean the sender of the args has to make a couple passes of the
  21. data before it can begin writing the args to the environment area (it
  22. has to find the empty args first, since the way of expressing them in
  23. list form requires a variable amount of up-front space).  
  24.  
  25.  On the receiving end, a process of tokenizing and ascii->binary 
  26. conversion is needed.  I picture the need for something like an
  27. is_in_null_list(argnum) function that scans the ascii ARGV= string,
  28. tokenizing and converting ascii->binary as it goes, and this will
  29. have to be called for any arg that starts with a space.  The empty list
  30. can't be easily binary'd once without setting arbitrary limits on its
  31. size or using dynamic memory allocation.  (IE, it looks like a lot of
  32. the runtime library might get sucked into every program just so that
  33. ARGV args can be processed.)  Runtime performance is a secondary
  34. consideration. Now that I've grown used to having ARGV support
  35. around, I've also grown used to abusing it in makefiles, especially
  36. by doing things like passing 400 object modules names to AR on a
  37. single command line, and so on.  I don't like the idea of making two
  38. passes of 400 args if it can be avoided.
  39.  
  40.  As I remember it, the last thing I proposed on usenet was a simple
  41. escaping mechanism which was neither embraced nor definitively shot
  42. down by presenting a situation in which it failed catastrophically.
  43. Let me see if I can recall it and present it again in an organized
  44. fashion...
  45.  
  46.  First, let's consider non-ARGV schemes.  xArgs already deals with
  47. empty args; anything we do doesn't affect it.  Technically, the
  48. basepage image of the command line also allows empty args.  The rule
  49. is that the string is terminated by count, not contents.  A \0 in the
  50. basepage can signal an empty arg without any problems, according to
  51. the standard.  In reality, many implementations use the count byte to
  52. place a \0 at the end of the string, then use strcpy(), strtok(), and
  53. similiar tools to process the image.  An embedded \0 would break
  54. these things.  However, I think the way they'd break is pretty safe --
  55. the program will most likely see fewer args than it expects, and
  56. will thus whine and die.  It isn't likely that the program will break
  57. in catastrophic or data-damaging ways.  It will also be pretty simple
  58. to change existing routines that parse the basepage image to be
  59. driven by count rather than using strtok() et. al.
  60.  
  61.  That leaves ARGV.  My escaping mechansim can be summed up in one
  62. sentence:  If the first character of any arg is less than or equal to
  63. \1, that arg is prefixed with an extra \1.
  64.  
  65.  On the arg-sender's side, this is implemented as the data is being
  66. written to the environment data area.  It examines the first char of
  67. each arg string as it is being copied to the env area.  If the char
  68. is <=1, it outputs a \1, followed by the rest of the arg string.
  69.  
  70.  On the receiving end, this is implemented as the argv[] array is
  71. being created.  The first char of each string is examined, and if it
  72. is \1, the pointer placed in argv[] is incremented by one, so that it
  73. points to the second char of the arg.
  74.  
  75.  An empty arg is represented in the env data as \1\0.  The \1 is
  76. skipped by the receiver, meaning that the pointer in argv[] will
  77. point to the \0.  An arg of \1 is represented in the env data as
  78. \1\1\0.  The first \1 is skipped, the pointer in argv[] will point to
  79. \1\0.  An arg of \1\2\3 is represented as \1\1\2\3\0; the pointer in
  80. argv[] will be to the second \1.  If the arg is non-empty and
  81. first char is not \1, neither the sender nor the receiver takes any
  82. special action, it works just as it does now. This strikes me as a
  83. general solution that doesn't require multiple passes of the data on
  84. the sending side, or tricky parsing on the receiving side.
  85.  
  86.  That leaves the issue of how unaware programs will behave, and I'll
  87. admit that's the part I've given the least thought to in this scheme.
  88. I'll brainstorm on the fly here, and rely on the fact that y'all may
  89. spot problems that don't occur to me.
  90.  
  91.  First let's consider an aware sender and an unaware receiver.  For
  92. an empty arg, the aware sender passes \1\0, and the receiver sees
  93. exactly that.  It will probably react badly to the \1, but probably
  94. not any worse than it would react to a space, I think.  Neither is a
  95. valid filename, and should result in an error message.  I don't know
  96. what other use a program might make of empty args.  A program such as
  97. tr would translate all occurances of \1 instead of the \0 chars you
  98. might have had in mind. But right now such a program can't translate
  99. the \0 chars anyway, there's no way to even ask it to.  A similar
  100. problem arises with trying to pass an arg of \1.  The aware sender
  101. passes \1\1\0, and the receiver might be a bit confused by getting
  102. two chars where it expected one.  But I don't see this as a leading
  103. to catastrophic data loss either.  
  104.  
  105.  In truth, one of the reasons I like the idea of a \1 as an escape 
  106. is because it strikes me as a char that doesn't often show up in args 
  107. now, and one that is likely to lead to a controlled failure of a 
  108. program that receives it unexpectedly (because it isn't anything like a 
  109. valid filename or option). It might be a valid char to a program that 
  110. searches for or translates string of characters in a file, but it 
  111. shouldn't show up often in such contexts, and should at worst lead to 
  112. the program not finding the strings in the file because of the extra \1.
  113.  
  114.  Now let's consider an unaware sender and an aware receiver.  I don't
  115. know what an unware sender is likely to do with an empty arg.  If the
  116. sender just puts the \0 into the env area, you end up with \0\0,
  117. prematurely terminating the args, which is just what happens right
  118. now anyway, no change there.  The real problem here is that if an arg
  119. starts with \1, the aware receiver is going to skip that char,
  120. causing a possible screw-up in the receiver's behavior, because it's
  121. skipping something that isn't validly a prefix char.  I'm tempted to
  122. say "so what, it isn't a situation that comes up often enough to
  123. worry about, as per the discussion above on how rare leading \1 chars
  124. in args are."  
  125.  
  126.  But, if there's a feeling that we should care about this just for 
  127. completeness' sake, then what we need is some extra validation that
  128. an aware receiver can use to determine whether the sender is aware.  
  129. In that case, we can resort to a simple marker passed as the value 
  130. following the ARGV= part of the env.  We need only be careful that we
  131. choose a marker than can't happen in MWC's current use of the ARGV= 
  132. value.  I forget the details of MWC's use of that string, but I'll 
  133. bet something as simple as ARGV=ARGV2\0 would do the trick. Then 
  134. the receiver need only verify the presence of the ARGV2 string, and 
  135. use that as its key on whether to skip leading \1 chars in the args.
  136.  
  137.  Well, that's my idea and my thoughts on it.  I'll be happy to 
  138. implement (in HSC's runtime library) any reasonable scheme that 
  139. everyone agrees on.  Frankly, with my current worries over the proper 
  140. definition of the GEM programming interface, I won't have a lot of 
  141. energy to spare in lobbying hard for this ARGV scheme.  In both cases,
  142. it's accomodating the widest range of people that interests me most, 
  143. but since I do more GEM programming than CLI-related stuff, that's 
  144. where most of my energy will be going.
  145.  
  146.  Feel free to redistribute this reply to your mailin